x86-64 linux: call evtchn_do_upcall on irq stack and adjust irqcount
authorcl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Wed, 8 Feb 2006 15:31:38 +0000 (15:31 +0000)
committercl349@firebug.cl.cam.ac.uk <cl349@firebug.cl.cam.ac.uk>
Wed, 8 Feb 2006 15:31:38 +0000 (15:31 +0000)
Especially in the light of the recent no-idle-tick preparations in
native x86-64 it is important that exit_idle() has proper state
available.  For this reason, the processor's irqcount must be adjusted
within upcalls, and for consistency and similarity with native code
this call should also execute on the processor's irq stack.
At once the patch slightly simplifies the pre-existing code by copying
%rdi into %rsp instead of adding 8 to %rsp, and by using %rdi instead
of %rsp (avoiding a needless resource dependency) for storing the event
mask.

From: Jan Beulich <JBeulich@novell.com>
Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S

index 5c3f6e988f4e8dabc74b05d494776c54f32dc5c7..438ab8f1647e14297234c3ec9ddc2a070314a7c2 100644 (file)
@@ -826,10 +826,16 @@ ENTRY(hypervisor_callback)
 ENTRY(do_hypervisor_callback)   # do_hyperviosr_callback(struct *pt_regs)
 # Since we don't modify %rdi, evtchn_do_upall(struct *pt_regs) will
 # see the correct pointer to the pt_regs
-        addq $8, %rsp            # we don't return, adjust the stack frame
-11:    movb $0, EVENT_MASK(%rsp)         
+       movq %rdi, %rsp            # we don't return, adjust the stack frame
+11:    movb $0, EVENT_MASK(%rdi)
+       movq %gs:pda_irqstackptr,%rax
+       incl %gs:pda_irqcount
+       cmovzq %rax,%rsp
+       pushq %rdi
        call evtchn_do_upcall
-        jmp  error_exit
+       popq %rsp
+       decl %gs:pda_irqcount
+       jmp  error_exit
 
 #ifdef CONFIG_X86_LOCAL_APIC
 ENTRY(nmi)